package c18类加载和反射;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.*;

public class s23利用反射获取并调用操作方法 {

	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException, NoSuchMethodException,
			SecurityException, IllegalArgumentException, InvocationTargetException {

		TestFieldName t = new TestFieldName();
		Class<?> clazz = t.getClass();
		Method m = clazz.getMethod("pub", String.class);//前者为方法名，后者为形参类型列表
		Method prim = clazz.getDeclaredMethod("pri", String.class);
		Method sm = clazz.getMethod("sm");//如果是无参方法，形参列表可以直接省略

		//调用方法：m.invoke(方法所属对象, 实参列表);
		m.invoke(t, "public方法");
		//设置方法的访问权限：true为取消访问权限检查，即可以访问private方法
		prim.setAccessible(true);
		prim.invoke(t, "private方法");
		sm.invoke(null);//静态方法不属于对象，所以传入null！不过传入t也可以~

		//形参
		for (Class<?> c : m.getParameterTypes()) {
			System.err.println(c);
		}
		for (Type type : m.getGenericParameterTypes()) {
			System.err.println(type);
		}
		//返回值
		System.err.println(m.getReturnType());
		System.err.println(m.getGenericReturnType());
		//异常
		for (Class<?> c : m.getExceptionTypes()) {
			System.err.println(c);
		}
		for (Type type : m.getGenericExceptionTypes()) {
			System.err.println(type);
		}
		//是否含有数量可变的形参
		System.err.println(m.isVarArgs());
		System.err.println(m.isBridge());
	}

}
